/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controladores;

import Dominio.Despesa;
import Base.ArquivoDespesas;

import Utils.UtilPack;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;

/**
 *
 * @author Higor
 */
public class ControladorDespesas {
    
    static final int first_year = 2010;
    static final int last_year = 2099;
    
    private Map m_despesas;
     //map de despesas classificado por ano
    //um arquivo no disco pra cada ano
    
    private static ControladorDespesas m_instance;
    
    private ControladorDespesas(){
        this.iniciarMapDespesas();
        this.obterListaDespesasDaBase();
    }
    
    public static ControladorDespesas getInstance(){
        if(m_instance == null)
            m_instance = new ControladorDespesas();
        return m_instance;
    }
    
    private void iniciarMapDespesas(){
        ArrayList<Despesa> despesas = null;
        for(int i = 2010; i < 2099; i++){
            m_despesas.put(i, despesas);
        }
    }
    
    private void adicionarDespesas(Date _data, ArrayList<Despesa> _listaDespesas){
        if(_data == null || _listaDespesas == null)
            return;               
        m_despesas.put(_data.getYear(), _listaDespesas);
    }
    
    private boolean adicionarDespesa(Despesa _despesa){
        //pegar o ano do map e adicionar na lista
        Date data = _despesa.getData();
        
        if(data == null || _despesa == null)
            return false; 
        
        ArrayList<Despesa> despesas = new ArrayList<Despesa>();
        despesas = (ArrayList<Despesa>) m_despesas.get(data.getYear());
        
        boolean retorno = despesas.add(_despesa);
        m_despesas.put(data.getYear(), despesas);
        
        return retorno;
    }
    
    private boolean atribuirListaAoMap(ArrayList<Despesa> _despesas){
       Despesa despesa;
       despesa = new Despesa();
       Iterator<Despesa> it;
       for(int i = first_year; i <= last_year; i++){
           ArrayList<Despesa> despesas_ano;
           despesas_ano = new ArrayList<Despesa>();
           for(it = _despesas.iterator(); it.hasNext();){   
               despesa = it.next();
               if(despesa.getData().getYear() == i){
                   despesas_ano.add(despesa);
               }
           }
           m_despesas.put(i, despesas_ano);
       }
       return true;
   }
    
   private boolean atribuirMapALista(ArrayList<Despesa> _despesas){
       for(int i = first_year; i<= last_year; i++){
            ArrayList<Despesa> lista_despesas = (ArrayList<Despesa>) m_despesas.get(i);
            _despesas.addAll(lista_despesas);
       } 
       return true;
   }
    
    private boolean obterDespesasPorData(Date _data, ArrayList<Despesa>  _despesas){   
        if(_data == null)
            return false; 
        ArrayList<Despesa> despesas; 
        despesas = new ArrayList<Despesa>();
        despesas = (ArrayList<Despesa>) m_despesas.get(_data.getYear()); 
        Despesa despesa = new Despesa(); 
        Iterator<Despesa> it;
        for(it = despesas.iterator(); it.hasNext();){           
            despesa = it.next();         
            if(despesa.getData() == _data){
                if(_despesas.add(despesa) == false)
                    return false;
                }
            }
        return true;
    }
    
    private boolean obterDespesasPorMes(int _ano, int _mes, ArrayList<Despesa> _despesas){
        if(_mes == 0)
            return false;
        ArrayList<Despesa> despesas; 
        despesas = new ArrayList<Despesa>();
        despesas = (ArrayList<Despesa>) m_despesas.get(_ano); 
        Despesa despesa = new Despesa();
        Iterator<Despesa> it;
        for(it = despesas.iterator(); it.hasNext();){            
            despesa = it.next();
            if (despesa.getData().getMonth() == _mes)
                if(_despesas.add(despesa) == false)
                    return false;
        }
        return true;  
   }
    
   private boolean obterListaDespesasDaBase(){
       ArrayList<Object> list_aux;
       list_aux = new ArrayList<Object>();
       boolean retorno = ArquivoDespesas.lerDespesas(list_aux);
       if(retorno == false)
           return false;
       ArrayList<Despesa> despesas;
       despesas = new ArrayList<Despesa>();
       retorno = list_aux.containsAll(despesas);
       retorno = this.atribuirListaAoMap(despesas);
       if(retorno == false)
           return false;
       return retorno;
   }
   
   private boolean salvarListaDespesasNaBase(){
       ArrayList<Despesa> despesas;
       despesas = new ArrayList<Despesa>();
       boolean retorno = this.atribuirMapALista(despesas);
       ArrayList<Object> list_aux;
       list_aux = new ArrayList<Object>();
       list_aux.addAll(despesas);
       retorno = ArquivoDespesas.salvarDespesas(list_aux);
       if(retorno == false)
           return false;
       return retorno;
   }
   
   public boolean inserirDespesa(String _titulo, String _valor, Date _data, String _tipo, String _desc){
             
       Despesa nova_despesa = new Despesa(_titulo, UtilPack.convertStringToDouble(_valor), _data, _tipo, _desc);
       boolean retorno = this.adicionarDespesa(nova_despesa);
       if(retorno == false)
           return false;
       retorno = this.salvarListaDespesasNaBase();
       return retorno;
   }
   
   
    
}
